/**
 * 任务队列，用于限制同时最多执行多少个任务
 * @author 赵占涛
 */
export class TaskQuene {
    /** 线程数 */
    private threadCount:number = 256;
    /** 正在执行的线程数 */
    private doingCount:number = 0;
    /** 任务队列 */
    private tasks:((completeCb:()=>void)=>void)[] = [];
    /**
     * @param threadCount 线程数
     */
    constructor(threadCount:number) {
        this.threadCount = threadCount;
    }
    /** 执行一个任务 */
    do(task:(completeCb:()=>void)=>void) {
        this.tasks.push(task);
        if (this.doingCount < this.threadCount) {
            this.realDo();
        }
    }
    /** 真正执行一个任务 */
    private realDo() {
        let task = this.tasks.pop();
        if (task) {
            this.doingCount++;
            task(()=>{
                this.doingCount--;
                if (this.tasks.length > 0) {
                    this.realDo();
                }
            });
        }
    }
}